package com.example.servletdemo.redis;

import com.example.servletdemo.utils.DateUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class RedisTest {

    private static Jedis jedis;

    public static void main(String[] args) {

//      jedis = new Jedis("127.0.0.1", 6379);//连接redis，ip与端口
//     jedis.auth("888888");//授权密码
//     String value = jedis.ping();//测试是否连接
//    System.out.println(value);
//      jedis.close();//关闭连接
       connectRedis();


    //   KeyFunction();//key相关
      //  StrFunction();//String
       // HashFunction();//HashMap
    //    ListFunction();//List
    //    zSetFunction();//Zset
//        SetFunction();//set
    }

    public static void connectRedis(){
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(1);//最大能够保持idle的数量，控制一个pool最多有多少个状态为idle的jedis实例
        jedisPoolConfig.setMaxTotal(2);//在指定时刻通过pool能够获取到的最大的连接的jedis个数
        jedisPoolConfig.setMaxWaitMillis(2000);
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379, 30000, "888888");
        for (int i = 0; i < 5; i++) {
            try {
                Jedis resource = jedisPool.getResource();
                System.out.println(i + ":" + resource+(DateUtils.getTimeString()));
            //    resource.close();
            } catch (Exception e) {
                System.out.println(i+":"+e+(DateUtils.getTimeString()));
            }
        }
    }

    /**
     * zSet 类型  有序
     */
    public static void zSetFunction(){
        //添加
        HashMap<String, Double> stringDoubleHashMap = new HashMap<>();
        stringDoubleHashMap.put("a",1.0);
        stringDoubleHashMap.put("b",3.0);//6
        stringDoubleHashMap.put("c",2.4);
        jedis.zadd("zset",stringDoubleHashMap);

        //查询 返回指定下标的集合 0 -1 就是全部
        System.out.println("查询全部结果-------------------");
        Set<String> setList = jedis.zrange("zset", 0, -1);
        //取出元素内所有值
        for (String key:setList){
            System.out.println(key);
        }

        //为指定的key增加评分
        jedis.zincrby("zset",3,"b");
        System.out.println("为指定的key增加评分，查询结果-------------------");
        Set<String> setList2 = jedis.zrange("zset", 0, -1);
        //取出元素内所有值
        for (String key:setList2){
            System.out.println(key);
        }


        //查询 返回指定评分内的数据
        System.out.println("返回指定评分内的数据，查询结果-------------------");
        Set<String> setList3 = jedis.zrangeByScore("zset", 0, 3);
        //取出元素内所有值
        for (String key:setList3){
            System.out.println(key);
        }

        //删除该集合下，指定值的元素
        jedis.zrem("zset","b");
        System.out.println("删除该集合下，指定值的元素,查询结果-------------------");
        Set<String> setList4 = jedis.zrangeByScore("zset", 0, 2);
        //取出元素内所有值
        for (String key:setList4){
            System.out.println(key);
        }
    }

    /**
     * Set 类型  无序
     */
    public static void SetFunction(){
        //添加
        jedis.sadd("set","a","b","c","e","f");

        //查看元素中的个数
        Long size = jedis.scard("set");
        System.out.println("个数："+size);

        System.out.println("-------------------");
        //取出元素内所有值
        Set<String> setList = jedis.smembers("set");
        for (String key:setList){
            System.out.println(key);
        }

        System.out.println("-------------------");

        //删除元素中的值
        Long i = jedis.srem("set","a");
        Set<String> setList2 = jedis.smembers("set");
        for (String key:setList2){
            System.out.println(key);
        }
    }

    /**
     * Hash 类型
     */
    public static void HashFunction(){
        //添加
        jedis.hset("hash","name","adc");
        //获取
        String hget = jedis.hget("hash", "name");
        System.out.println(hget);

        //批量添加
        Map<String,String> map=new HashMap<String,String>();
        map.put("age","12");
        map.put("name","lihua");
        jedis.hmset("user",map);

        //查看哈希表 key 中，给定域 field 是否存在
        Boolean hexists = jedis.hexists("user", "age");
        Boolean hexists1 = jedis.hexists("user", "age1");
        System.out.println("hexists:"+hexists+" hexists1:"+hexists1);
    }

    /**
     * List 类型
     */
    public static void ListFunction(){
        //右添加
        jedis.rpush("list","a","b","c");
        //查询
        List<String> list = jedis.lrange("list", 0, 5);
        System.out.println(list.toString());

        // 左取值
        String lpop = jedis.lpop("list");
        // 右取值
        String rpop = jedis.rpop("list");
        System.out.println("lpop:"+lpop+" rpop:"+rpop);
    }

    /**
     * String 类型
     */
    public static void StrFunction(){
        //添加键值对
        jedis.set("a","123");
        jedis.append("a","45");
        //获取key值对应的value值
        String a=jedis.get("a");

        System.out.println("结果："+a);
        //可存储指定过期时间的数据
        jedis.setex("b",10,"123456");
        //获取key的生存时间
        Long b_ttl = jedis.ttl("b");
        System.out.println("b的生存时间："+b_ttl);
    }

    public static void KeyFunction(){
        //遍历输出所有key
        Set<String> keys = jedis.keys("*");
        System.out.println(keys.size());
        for (String key:keys){
            System.out.println(key);
        }
    }
}
